#include <my_header.h>

/* Usage:  */
int main(void){                                  
    char *ip = "192.168.229.128";
    char *port = "8080";

    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    ERROR_CHECK(socket_fd, -1, "socket");

    struct sockaddr_in sockaddr;
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(atoi(port));
    sockaddr.sin_addr.s_addr = inet_addr(ip);

    int res_conn = connect(socket_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
    ERROR_CHECK(res_conn, -1, "connect");

    // 第一版: 信息没有边界
    // 接收文件名, 并创建
    //char file_name[60] = {0};
    //recv(socket_fd, file_name, sizeof(file_name), 0);
    //int file_fd = open(file_name, O_RDWR|O_CREAT, 0666);
    // 接收文件内容, 写入
    //char buf[1000] = {0};
    //ssize_t recv_num = recv(socket_fd, buf, sizeof(buf), 0);
    //write(file_fd, buf, recv_num);


    // 改版: 信息在应用层有边界  
    // 接收文件名的长度  
    int file_name_len;  
    recv(socket_fd, &file_name_len, sizeof(int), 0); // 接收文件名长度  

    char file_name[60] = {0}; // 文件名缓冲区  
    recv(socket_fd, file_name, file_name_len, 0); // 根据长度接收文件名  

    // 创建文件并打开  
    int file_fd = open(file_name, O_RDWR | O_CREAT, 0600); // 以读写模式创建文件，权限为0600  

    // 接收文件内容的长度  
    int len;  
    recv(socket_fd, &len, sizeof(int), 0); // 接收文件内容长度  
    char buf[1000] = {0}; // 缓冲区用于接收数据  
    recv(socket_fd, buf, len, 0); // 接收文件内容，按照长度接收  

    // 将接收到的内容写入文件  
    write(file_fd, buf, len); // 将接收到的内容写入文件  

    // 关闭文件描述符和socket  
    close(file_fd); // 关闭文件  
    close(socket_fd); // 关闭socket  
    return 0; // 正常结束  
}

